package cn.tqfeiyang.smartadmin.business.organization.mapper;

import cn.tqfeiyang.smartadmin.business.organization.entity.EmployeeEntity;
import cn.tqfeiyang.smartadmin.business.organization.request.EmployeeQueryDTO;
import cn.tqfeiyang.smartadmin.business.organization.response.EmployeeDetailVO;
import cn.tqfeiyang.smartadmin.business.organization.response.EmployeeQueryVO;
import cn.tqfeiyang.smartadmin.business.organization.entity.AddressEntity;
import cn.tqfeiyang.smartadmin.business.organization.response.AddressQueryVO;
import cn.tqfeiyang.smartadmin.system.entity.RoleEntity;
import cn.tqfeiyang.smartadmin.system.response.RoleQueryVO;
import cn.tqfeiyang.smartadmin.commons.mybatis.MPBaseMapper;
import cn.tqfeiyang.smartadmin.commons.Constants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 员工映射接口
 *
 * @author tqfeiyang
 * @since 2024-10-18
 */
@Mapper
public interface EmployeeMapper extends MPBaseMapper<EmployeeEntity> {

    /**
     * 查询员工列表
     *
     * @param dto 请求数据
     * @return 员工列表
     */
    List<EmployeeQueryVO> queryEmployees(@Param(Constants.DTO) EmployeeQueryDTO dto);

    /**
     * 查询员工详情
     *
     * @param employeeId 员工id
     * @return 员工详情
     */
    EmployeeDetailVO readEmployee(Long employeeId);

    /**
     * 删除员工实体
     *
     * @param employeeId 员工id
     */
    void deleteEmployee(Long employeeId);


     /**
      * 检查登录账号是否存在
      *
      * @param loginName 登录账号
      * @param excludeId 排除的id
      * @return 如果登录账号已经存在则返回true，否则返回false
      */
    boolean checkLoginNameExists(String loginName, Long excludeId);

     /**
      * 检查电子邮件是否存在
      *
      * @param email 电子邮件
      * @param excludeId 排除的id
      * @return 如果电子邮件已经存在则返回true，否则返回false
      */
    boolean checkEmailExists(String email, Long excludeId);

     /**
      * 检查电话是否存在
      *
      * @param phone 电话
      * @param excludeId 排除的id
      * @return 如果电话已经存在则返回true，否则返回false
      */
    boolean checkPhoneExists(String phone, Long excludeId);

     /**
      * 根据员工id，查询地址笔数
      *
      * @param employeeId 员工id
      * @return 地址笔数
      */
    int countOfAddressesByEmployeeId(Long employeeId);

    /**
     * 根据员工id，查询地址响应列表
     *
     * @param employeeId 员工id
     * @return 地址响应列表
     */
    List<AddressQueryVO> queryAddressesByEmployeeId(Long employeeId);

    /**
     * 根据员工id，查询地址实体列表
     *
     * @param employeeId 员工id
     * @return 地址实体列表
     */
    List<AddressEntity> getAddressesByEmployeeId(Long employeeId);

     /**
      * 根据员工id，查询角色笔数
      *
      * @param employeeId 员工id
      * @return 角色笔数
      */
    int countOfRolesByEmployeeId(Long employeeId);

    /**
     * 根据员工id，查询角色响应列表
     *
     * @param employeeId 员工id
     * @return 角色响应列表
     */
    List<RoleQueryVO> queryRolesByEmployeeId(Long employeeId);

    /**
     * 根据员工id，查询角色实体列表
     *
     * @param employeeId 员工id
     * @return 角色实体列表
     */
    List<RoleEntity> getRolesByEmployeeId(Long employeeId);

    /**
     * 根据员工id，查询角色id列表
     *
     * @param employeeId 员工id
     * @return 角色id列表
     */
    List<Long> getRoleIdsByEmployeeId(Long employeeId);

    /**
     * 根据员工id，分配角色id列表
     *
     * @param employeeId 员工id
     * @param roleIds 角色id列表
     */
    void assignRoleIdsByEmployeeId(Long employeeId, List<Long> roleIds);

    /**
     * 根据员工id，删除角色id列表
     *
     * @param employeeId 员工id
     * @param roleIds 角色id列表
     */
    void deleteRoleIdsByEmployeeId(Long employeeId, List<Long> roleIds);

    /**
     * 根据员工id，清空所有分配的角色id
     *
     * @param employeeId 员工id
     */
    void deleteAllRoleIdsByEmployeeId(Long employeeId);

}
